Оператор [timeout]
Описание
Счётчики и таймеры — неотъемлемая часть событийных процессов всякого микроэлектронного прибора. Оператор [timeout] позволяет организовать обратный отсчёт временного отрезка, заданного в секундах. На каждой итерации обработки правила оператор [timeout] будет возвращать в логический узел количество отсчитываемых секунд. Как только это значение достигнет нуля, [timeout] начнёт отсчёт сначала.
Пример применения
В примере ниже показан фрагмент правила, состоящий из двух узлов:
- Узел N1_timeout — получает значение задержки из конфигурации устройства при помощи
[load-ubus], а затем запускает таймер обратного отсчёта при помощи[timeout] - Узел N2_switch — запускает переключение GSM-модема на резервную SIM-карту, когда отсчёт времени достигнет нуля
Узел "N1_timeout" -- Создаём узел для загрузки в него временного интервала с обратным отсчётом.
-----------------
N1_timeout = {
{
["load-ubus"] = function (nodes) -- Загружаем значение временного интервала из конфигурации прибора
return { -- при помощи оператора ["load-ubus"]
object = "uci",
method = "get",
params = { -- Результат:
config = "tsmodem", -- {
section = "sim_0", -- "value": "180"
option = "timeout_reg", -- }
}
}
end
},
{
["timeout"] = function(nodes) -- Запускаем обратный отсчёт времени: 180..179..178 и т.д. до нуля.
return tonumber(nodes.timeout.value) -- при помощи оператора ["timeout"].
end
}, -- Теперь на каждой итерации обработки правил
}, -- узел "N1_timeout" будет содержать количество секунд, уменьшаемое во времени.
Узел "N2_switch"
----------------
N2_switch = { -- Создаём узел, выполняющий переключение на резервную сим-карту.
{
["skip"] = function (nodes) -- При помощи оператора ["skip"] проверяем не истекло ли время задержки.
local stil_wait = (nodes.timeout.value > 0) -- Если счётчик обратного отсчёта, хранимый в узле "N1_timeout", всё ещё больше нуля,
return stil_wait -- то пропускаем выполнение следующих операторов (load-ubus, frozen).
end
},
{
["load-ubus"] = function (nodes) -- При помощи оператора ["load-ubus"] отправляем на системную шину команду "switch" -
return { -- т.е. - переключение на резервный слот сим-карты.
object = "tsmstm",
method = "switch",
}
end
},
{
["frozen"] = function (nodes) -- При помощи оператора ["frozen"] "замораживаем" узел на 30 секунд,
return 30 -- предотвращая обработку данного узла на следующих итерациях.
end -- Это даёт прибору время, необходимое для завершения процедуры переключения слотов.
},
},
Как это работает
- [timeout] получает начальное значение (в примере — 180 секунд из конфигурации)
- На каждой итерации обработки правил значение уменьшается: 180 → 179 → 178 ... → 0
- Когда значение достигает нуля, отсчёт начинается заново
- Узел N2_switch проверяет ([skip]), не истекло ли время. Пока timeout.value > 0, переключение не происходит. При достижении нуля — выполняется load-ubus с командой switch